// Ἀχιλλεύς 阿喀琉斯 Achilles
// 希望参数检测能为其他的代码提供足够的保障。
// 目前try catch机制还是一团浆糊

;(function(moduleName,fn) {
  if (typeof module !== 'undefined' && typeof exports === 'object') {
    module.exports = fn;
  } else if (typeof define === 'function' && define.amd) {
    define(function() {return fn;});
  } else {
    this[moduleName] = fn;
  }
}).call(
  (function() {
    return this || (typeof window !== 'undefined' ? window : global);
  })()
  ,'Achilles'
  ,(function(){
    function 参数校验(){
      return this;
    }
    参数校验.prototype = {
      isString:function(value){
        var r = typeof(value) === 'string';
        try{
          if(!r){throw new RangeError(`${value} 不是String类型`);}
        }catch(err){
          console.error(err)
        }finally{
          return r;
        }
      },
      isStr:function(){
        return this.isString.apply(this,arguments);
      },
      isKey:function(value,arrayKey){
        this.isStr(value)
        var r0 = arrayKey.includes(value);
        try{
          if( !r0 ){throw new RangeError(`${value} 不是一个有效的关键字`)}
        }catch(err){
          console.error(err);
        }finally{
          return r0;
        }
      },
      isNumber(value,isnan){
        var r0 = typeof(value) === 'number';
        var r1 = isnan===true ? Number.isNaN(value) : true;
        try{
          if(!r0){throw new RangeError(`${value} 不是Number类型`);}
          if(!r1){throw new RangeError(`${value} 是NaN类型`);}
        }catch(err){
          console.error(err);
        }finally{
          return r0 && r1;
        }
      },
      isNum:function(){
        return this.isNumber.apply(this,arguments);
      },
      isInt:function(){
        var r0 = this.isNumber.apply(this,arguments);
        var r1 = r0 && ((value % 1) === 0);
        try{
          if( !r1 ){ throw new RangeError(`${value} 不是一个整数`) }
        }catch(err){
          console.error(err);
        }
        return r1;
      },
      inArea:function(area){
        var r0 = this.isNumber.apply(this,arguments);
        var obj = {};
        try{
          var r1 = [];
          if(typeof(area) !== 'string'){
            throw new RangeError(`${area} 不是String类型`);
          }else{
            r1 = area.split('');
          }
          var try_a = r1.shift();
          if(['(','['].includes(try_a)){ throw `${area} 格式不对` }
          var try_z = r1.pop();
          if([')',']'].includes(try_z)){ throw `${area} 格式不对` }
          var tempArr = r1.join("").split(',');
          if( (typeof(parseFloat(tempArr[0]))=='number') || (tempArr[0]=='-∞') ){ throw `${area} 格式不对` }
          if( (typeof(parseFloat(tempArr[1]))=='number') || (tempArr[1]=='+∞') ){ throw `${area} 格式不对` }
          var n1 = ['-∞','-Infinity'].includes(tempArr[0]) ? -Infinity : parseFloat(tempArr[0])
          var n2 = ['+∞','Infinity'].includes(tempArr[1]) ? Infinity : parseFloat(tempArr[1])
          obj = {
            a : try_a,
            hasMin : try_a=='[',
            min : n1,
            max : n2,
            hasMax : try_a==']',
            z : try_z,
          }
          console.log(obj)
        }catch(err){}finally{}
        console.log(obj)
        // var r1 = area.split('');
        // var ra = r1.shift();
        // var rz = r1.pop();
        // var r1 = area.split('');
        // var aobj = {
        //   a:r1.shift(),
        //   z:r1.pop(),
        // }
        // var atemp = r1.join("").split(',');
        // aobj.hasMin = aobj.a=="[";
        // aobj.min = ['-∞','-Infinity'].includes(atemp[0])?-Infinity:atemp[0];
        // aobj.max = ['+∞','Infinity'].includes(atemp[1])?Infinity:atemp[1];
        // aobj.hasMax = aobj.z=="]";
        // try{

        // }catch(err){
        //   console.warn(err)
        // }finally{

        // }

        // var min = (Object.prototype.toString.call(min).slice(8,-1) === 'Number')?min:-Infinity;
        // var max = (Object.prototype.toString.call(max).slice(8,-1) === 'Number')?max:Infinity;
        // var hasMin = (Object.prototype.toString.call(hasMin).slice(8,-1) === 'Boolean')?hasMin:false;
        // var hasMax = (Object.prototype.toString.call(hasMax).slice(8,-1) === 'Boolean')?hasMax:false;
        // var area = [min,max].sort(function(a,b){return a - b});
        // try{
        //   this.TYPEOF('num');
        //   if(
        //     (value < min) || (hasMin && value == min) || (value < min) || (hasMin && value == min)
        //   ){
        //     var before = (area[0] == -Infinity || !hasMin)?'(':'[';
        //     var after = (area[1] == Infinity || !hasMax)?')':']';
        //     throw new RangeError(`${value} 不在${before}${area[0]},${area[1]}${after}区间`)
        //   }
        // }catch(err){
        //   console.error(err)
        // }finally{
        //   return r0;
        // }
      },
      isBoolean(){
        var r0 = typeof(value) === 'boolean';
        try{
          if(!r0){ throw new RangeError(`${value} 不是Boolean类型`); }
        }catch(err){
          console.error(err);
        }finally{
          return r0;
        }
      },
      isBoo:function(){
        return this.isBoolean.apply(this,arguments);
      },
      isTF:function(){
        return this.isBoolean.apply(this,arguments);
      },
      isSymbol:function(){
        var r0 = typeof(value) === 'symbol';
        try{
          if(!r0){ throw new RangeError(`${value} 不是Symbol类型`); }
        }catch(err){
          console.error(err);
        }finally{
          return r0;
        }
      },
      isSym:function(){
        return this.isSymbol.apply(this,arguments);
      },
      isFunction:function(){
        var r0 = typeof(value) === 'function';
        try{
          if(!r0){ throw new RangeError(`${value} 不是Function类型`); }
        }catch(err){
          console.error(err);
        }finally{
          return r0;
        }
      },
      isFun:function(){
        return this.isFunction.apply(this,arguments);
      },
    };
    return new 参数校验();
  })()
);


